原帖 | Jason | 2026-03-11 14:24 | 👍0 | 阅读约1
Linux V4L2 应用开发流程
-
打开视频设备文件
-
操作:调用 open("/dev/videoX", O_RDWR) 得到文件描述符 fd
-
作用:建立应用与摄像头设备的连接,获取后续操作的“入口凭证”
-
查询/设置设备参数
-
查询能力: ioctl(fd, VIDIOC_QUERYCAP, &cap) → 确认设备支持视频采集
- 设置格式: ioctl(fd, VIDIOC_S_FMT, &fmt) → 指定分辨率、像素格式(如 640×480、YUYV)
- 设置帧率: ioctl(fd, VIDIOC_S_PARM, ¶) → 指定每秒采集帧数(如 30fps)
-
作用:和摄像头“约定好”画面规格,确保双方能正常通信
-
申请帧缓冲 + 内存映射
-
申请缓冲: ioctl(fd, VIDIOC_REQBUFS, &req) → 向内核申请多个数据缓冲块
- 内存映射: mmap() → 将内核缓冲地址映射到应用空间,直接读写摄像头数据(避免拷贝,提升效率)
-
作用:准备好存放画面数据的“临时仓库”
-
入队 + 启动采集
-
入队空缓冲: ioctl(fd, VIDIOC_QBUF, &buf) → 把空缓冲交给内核,等待摄像头写入数据
- 开启流: ioctl(fd, VIDIOC_STREAMON, &type) → 启动摄像头,开始持续采集画面
-
作用:让摄像头进入“工作状态”,往缓冲里填充新画面
-
出队 + 处理画面
-
出队满缓冲: ioctl(fd, VIDIOC_DQBUF, &buf) → 取出已填充好画面的缓冲
- 图像处理:执行自定义逻辑(如保存图片、显示、AI识别)
-
作用:拿到原始画面数据,进行业务处理
-
循环入队(反复采集)
-
操作:处理完后再次调用 ioctl(fd, VIDIOC_QBUF, &buf)
-
作用:将空缓冲重新放回队列,让摄像头继续填充新画面,实现持续采集
-
结束采集
-
停止流: ioctl(fd, VIDIOC_STREAMOFF, &type) → 让摄像头停止采集
- 释放资源: munmap() 解除内存映射, close(fd) 关闭设备文件
- 作用:安全释放所有资源,避免内存泄漏
💡 核心逻辑一句话总结
打开设备 → 约定画面规格 → 申请数据仓库 → 循环“取图-处理-还仓库” → 下班关设备


相关笔记
- 📁 返回本主题 MOC
- Linux编译视角调试方法
- Linux BSP问题闭环流程
- Linux 调试手段,涵盖 printk 使用、动态打印、trace
- 老师,构造的作用和意义是什么?
- 很多刚接触 Linux : Android 的同学
- 嵌入式 Linux 橙皮书系列更新 v2.0.0 版本